import {
  MESSAGE_TYPES,
  POST_MESSAGE_TYPES,
  createPostMessageResponse,
} from '../render/types/messages.js'
import { logger } from './logger.js'

logger.info('🎬 Content Script 已启动', { url: window.location.href })

/**
 * 验证消息来源是否安全（仅允许同源）
 * @param {string} origin - 消息来源
 * @returns {boolean} 是否安全
 */
function isOriginSafe(origin) {
  return origin === window.location.origin
}

/**
 * 发送响应消息到页面
 * @param {string} traceId - 追踪ID
 * @param {boolean} success - 是否成功
 * @param {any} data - 响应数据
 * @param {string} message - 响应消息
 * @param {string} origin - 目标来源
 */
function sendResponse(traceId, success, data, message, origin) {
  logger.debug('发送响应到页面', { traceId, success, message })
  window.postMessage(createPostMessageResponse(traceId, success, data, message), origin)
}

// 通知页面 contentScript 已加载
window.postMessage(
  {
    type: MESSAGE_TYPES.CONTENT_SCRIPT_READY,
    message: '插件已准备就绪',
  },
  '*',
)
logger.info('已通知页面：Content Script 准备就绪')

// 监听来自页面的 postMessage 消息
window.addEventListener('message', async (event) => {
  // 验证消息来源安全性
  if (!isOriginSafe(event.origin)) {
    logger.warn('拒绝来自不安全来源的消息', { origin: event.origin })
    return
  }

  const message = event.data

  // 检查是否是我们要处理的消息格式
  if (message?.type !== POST_MESSAGE_TYPES.REQUEST) {
    return
  }

  logger.debug('收到页面消息', { action: message.action, traceId: message.traceId })

  try {
    switch (message.action) {
      case MESSAGE_TYPES.PUBLISH_ARTICLE:
        logger.info('处理发布文章请求，转发到 background', { traceId: message.traceId })
        // 转发到 background 脚本处理
        chrome.runtime.sendMessage(
          {
            type: MESSAGE_TYPES.PUBLISH_ARTICLE,
            message: message,
            source: 'contentScript',
          },
          (response) => {
            logger.debug('收到 background 响应', { response })
            sendResponse(
              message.traceId,
              response?.success || false,
              response?.data || null,
              response?.message || '处理完成',
              event.origin,
            )
          },
        )
        break

      default:
        logger.warn('未知的操作类型', { action: message.action })
        sendResponse(
          message.traceId,
          false,
          null,
          `未知的操作类型: ${message.action}`,
          event.origin,
        )
        break
    }
  } catch (error) {
    logger.error('处理消息时发生错误:', error)
    sendResponse(message.traceId, false, null, `处理消息时发生错误: ${error.message}`, event.origin)
  }
})
